package com.stylefeng.guns.common.constant.factory;

import java.util.ArrayList;
import java.util.List;

import com.fasterxml.jackson.databind.JsonNode;
import com.stylefeng.guns.common.constant.state.Status;
import com.stylefeng.guns.common.exception.BizExceptionEnum;
import com.stylefeng.guns.common.persistence.dao.*;
import com.stylefeng.guns.common.persistence.model.*;
import com.stylefeng.guns.core.exception.GunsException;
import com.stylefeng.guns.core.util.JacksonUtil;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.context.annotation.DependsOn;
import org.springframework.stereotype.Component;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.stylefeng.guns.common.constant.cache.Cache;
import com.stylefeng.guns.common.constant.cache.CacheKey;
import com.stylefeng.guns.core.log.LogObjectHolder;
import com.stylefeng.guns.core.support.StrKit;
import com.stylefeng.guns.core.util.Convert;
import com.stylefeng.guns.core.util.SpringContextHolder;
import com.stylefeng.guns.core.util.ToolUtil;

/**
 * 常量的生产工厂
 *
 * @author fengshuonan
 * @date 2017年2月13日 下午10:55:21
 */
@Component
@DependsOn("springContextHolder")
public class ConstantFactory implements IConstantFactory
{
	private RoleMapper roleMapper = SpringContextHolder.getBean(RoleMapper.class);
	private DeptMapper deptMapper = SpringContextHolder.getBean(DeptMapper.class);
	private DictMapper dictMapper = SpringContextHolder.getBean(DictMapper.class);
	private UserMapper userMapper = SpringContextHolder.getBean(UserMapper.class);
	private MenuMapper menuMapper = SpringContextHolder.getBean(MenuMapper.class);
	private NoticeMapper noticeMapper = SpringContextHolder.getBean(NoticeMapper.class);
	private WebuserMapper webuserMapper = SpringContextHolder.getBean(WebuserMapper.class);
	private AreaMapper areaMapper = SpringContextHolder.getBean(AreaMapper.class);

	public static IConstantFactory me()
	{
		return SpringContextHolder.getBean("constantFactory");
	}

	/**
	 * 根据用户id获取用户名称
	 *
	 * @author stylefeng
	 * @Date 2017/5/9 23:41
	 */
	@Override
	public String getUserNameById(Integer userId)
	{
		User user = userMapper.selectById(userId);
		if (user != null) {
			return user.getName();
		} else {
			return "--";
		}
	}

	/**
	 * 根据用户id获取用户账号
	 *
	 * @author stylefeng
	 * @date 2017年5月16日21:55:371
	 */
	@Override
	public String getUserAccountById(Integer userId)
	{
		User user = userMapper.selectById(userId);
		if (user != null) {
			return user.getAccount();
		} else {
			return "--";
		}
	}

	/**
	 * 通过角色ids获取角色名称
	 */
	@Override
	@Cacheable(value = Cache.CONSTANT, key = "'" + CacheKey.ROLES_NAME + "'+#roleIds")
	public String getRoleName(String roleIds)
	{
		Integer[] roles = Convert.toIntArray(roleIds);
		StringBuilder sb = new StringBuilder();
		for (int role : roles) {
			Role roleObj = roleMapper.selectById(role);
			if (ToolUtil.isNotEmpty(roleObj) && ToolUtil.isNotEmpty(roleObj.getName())) {
				sb.append(roleObj.getName()).append(",");
			}
		}
		return StrKit.removeSuffix(sb.toString(), ",");
	}

	/**
	 * 通过角色id获取角色名称
	 */
	@Override
	@Cacheable(value = Cache.CONSTANT, key = "'" + CacheKey.SINGLE_ROLE_NAME + "'+#roleId")
	public String getSingleRoleName(Integer roleId)
	{
		if (0 == roleId) {
			return "--";
		}
		Role roleObj = roleMapper.selectById(roleId);
		if (ToolUtil.isNotEmpty(roleObj) && ToolUtil.isNotEmpty(roleObj.getName())) {
			return roleObj.getName();
		}
		return "";
	}

	/**
	 * 查询区域 省/市
	 * @return
	 */
	@Override
	public String getAreaCode(String code)
	{
		if (null != code && !"".equals(code)) {
			Area area = areaMapper.selectByCode(code);
			if (ToolUtil.isNotEmpty(area) && ToolUtil.isNotEmpty(area.getName())) {
				return area.getName();
			}
		}
		return "--";
	}

	/**
	 * 通过角色id获取角色英文名称
	 */
	@Override
	@Cacheable(value = Cache.CONSTANT, key = "'" + CacheKey.SINGLE_ROLE_TIP + "'+#roleId")
	public String getSingleRoleTip(Integer roleId)
	{
		if (0 == roleId) {
			return "--";
		}
		Role roleObj = roleMapper.selectById(roleId);
		if (ToolUtil.isNotEmpty(roleObj) && ToolUtil.isNotEmpty(roleObj.getName())) {
			return roleObj.getTips();
		}
		return "";
	}

	/**
	 * 获取部门名称
	 */
	@Override
	@Cacheable(value = Cache.CONSTANT, key = "'" + CacheKey.DEPT_NAME + "'+#deptId")
	public String getDeptName(Integer deptId)
	{
		Dept dept = deptMapper.selectById(deptId);
		if (ToolUtil.isNotEmpty(dept) && ToolUtil.isNotEmpty(dept.getFullname())) {
			return dept.getFullname();
		}
		return "";
	}

	/**
	 * 获取菜单的名称们(多个)
	 */
	@Override
	public String getMenuNames(String menuIds)
	{
		Integer[] menus = Convert.toIntArray(menuIds);
		StringBuilder sb = new StringBuilder();
		for (int menu : menus) {
			Menu menuObj = menuMapper.selectById(menu);
			if (ToolUtil.isNotEmpty(menuObj) && ToolUtil.isNotEmpty(menuObj.getName())) {
				sb.append(menuObj.getName()).append(",");
			}
		}
		return StrKit.removeSuffix(sb.toString(), ",");
	}


	/**
	 * 获取菜单名称
	 */
	@Override
	public String getMenuName(Long menuId)
	{
		if (ToolUtil.isEmpty(menuId)) {
			return "";
		} else {
			Menu menu = menuMapper.selectById(menuId);
			if (menu == null) {
				return "";
			} else {
				return menu.getName();
			}
		}
	}

	/**
	 * 获取菜单名称通过编号
	 */
	@Override
	public String getMenuNameByCode(String code)
	{
		if (ToolUtil.isEmpty(code)) {
			return "";
		} else {
			Menu param = new Menu();
			param.setCode(code);
			Menu menu = menuMapper.selectOne(param);
			if (menu == null) {
				return "";
			} else {
				return menu.getName();
			}
		}
	}

	/**
	 * 获取字典名称
	 */
	@Override
	public String getDictName(Integer dictId)
	{
		if (ToolUtil.isEmpty(dictId)) {
			return "";
		} else {
			Dict dict = dictMapper.selectById(dictId);
			if (dict == null) {
				return "";
			} else {
				return dict.getName();
			}
		}
	}

	/**
	 * 获取通知标题
	 */
	@Override
	public String getNoticeTitle(Integer dictId)
	{
		if (ToolUtil.isEmpty(dictId)) {
			return "";
		} else {
			Notice notice = noticeMapper.selectById(dictId);
			if (notice == null) {
				return "";
			} else {
				return notice.getTitle();
			}
		}
	}

	/**
	 * 根据字典类型代码及字典代码获取字典名称
	 */
	@Override
	@Cacheable(value = Cache.BASEDATA, key = "'" + CacheKey.DICT_NAME + "'+#code")
	public String getDictNameByCode(Integer code)
	{
		Dict pconditions = new Dict();
		pconditions.setId(code);
		pconditions.setStatus(Status.ENABLE.getCode());
		Dict dict = dictMapper.selectOne(pconditions);
		if (dict == null) {
			return null;
		} else {
			return dict.getName();
		}
	}

	/**
	 * 根据字典类型及字典名称获取字典代码
	 * @param name
	 * @return
	 */
	@Override
	@Cacheable(value = Cache.BASEDATA, key = "'" + CacheKey.DICT_CODE+ "'+#name")
	public Integer getDictIDByName(Integer pid ,String name)
	{
		Dict pconditions = new Dict();
		pconditions.setPid(pid);
		pconditions.setName(name);
		pconditions.setStatus(Status.ENABLE.getCode());
		Dict dict = dictMapper.selectOne(pconditions);
		if (dict == null) {
			return null;
		} else {
			return dict.getId();
		}
	}
	
	@Override
	public List<Dict> findDictByPID(Integer pid)
	{
		if (ToolUtil.isEmpty(pid)) {
			return null;
		} else {
			EntityWrapper<Dict> wrapper = new EntityWrapper<>();
			List<Dict> dicts = dictMapper.selectList(wrapper.eq("pid", pid).eq("status", Status.ENABLE.getCode()));
			if (dicts == null || dicts.size() == 0) {
				return null;
			} else {
				return dicts;
			}
		}
	}

	/**
	 * 根据dict id查询产品tips
	 * @param id
	 * @return
	 */
	public String findDictTips(Integer id){
		if(id == null){
			throw new GunsException(BizExceptionEnum.PARAM_ERROR);
		}
		Dict dict = this.findSingelDict(id);
		if(dict == null){
			throw new GunsException(BizExceptionEnum.PARAM_ERROR);
		}
		return dict.getTips();

	}


	/**
	 * 根据dict name查询tips
	 * @param name
	 * @return
	 */
	public String findDictByName(String name){
		if(name == null){
			throw new GunsException(BizExceptionEnum.PARAM_ERROR);
		}
		EntityWrapper<Dict> wrapper = new EntityWrapper<>();
		List<Dict> dicts = dictMapper.selectList(wrapper.eq("name", name));
		if (dicts == null && dicts.size() > 0)  {
			return null;
		} else {
			return dicts.get(0).getTips();
		}
	}

	public JsonNode findDictTipsNode(Integer id){
		String tips = findDictTips(id);
		try {
			JsonNode node = JacksonUtil.objectMapper.readTree(tips);
			return node;
		}catch (Exception e){
			throw new GunsException(BizExceptionEnum.PARAM_ERROR);
		}
	}

	@Override
	public Dict findSingelDict(Integer id) {
		if (ToolUtil.isEmpty(id)) {
			return null;
		} else {
			EntityWrapper<Dict> wrapper = new EntityWrapper<>();
			List<Dict> dicts = dictMapper.selectList(wrapper.eq("id", id));
			if (dicts == null && dicts.size() > 0)  {
				return null;
			} else {
				return dicts.get(0);
			}
		}
	}

	/**
	 * 获取被缓存的对象(用户删除业务)
	 */
	@Override
	public String getCacheObject(String para)
	{
		return LogObjectHolder.me().get().toString();
	}

	/**
	 * 获取子部门id
	 */
	@SuppressWarnings("null")
	@Override
	public List<Integer> getSubDeptId(Integer deptid)
	{
		Wrapper<Dept> wrapper = new EntityWrapper<>();
		wrapper = wrapper.like("pids", "%[" + deptid + "]%");
		List<Dept> depts = this.deptMapper.selectList(wrapper);
			ArrayList<Integer> deptids = new ArrayList<>();
		if (depts != null || depts.size() > 0) {
			for (Dept dept : depts) {
				deptids.add(dept.getId());
			}
		}
		return deptids;
	}

	/**
	 * 获取所有父部门id
	 */
	@Override
	public List<Integer> getParentDeptIds(Integer deptid)
	{
		Dept dept = deptMapper.selectById(deptid);
		String pids = dept.getPids();
		String[] split = pids.split(",");
		ArrayList<Integer> parentDeptIds = new ArrayList<>();
		for (String s : split) {
			parentDeptIds.add(Integer.valueOf(StrKit.removeSuffix(StrKit.removePrefix(s, "["), "]")));
		}
		return parentDeptIds;
	}


}
